/*******************************************************************************
* Copyright (C) 2003-2008, 2013, Guillaume Brocker
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Guillaume Brocker - Initial API and implementation
*
******************************************************************************/
package eclox.ui.editor.editors;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.widgets.FormToolkit;
/**
* Implements an setting editor for boolean values
*
* @author gbrocker
*/
public class BooleanEditor extends SettingEditor {
private static String YES = "YES"; ///< the yes selection value
private static String NO = "NO"; ///< the no selection value
private Button yesButton; ///< the yes button
private Button noButton; ///< the no button
private Button defaultButton; ///< the default button
private boolean isDirty = false; ///< a boolean telling if the editor is dirty or not
/**
* @brief Implements a selection listener that will be attached to each button.
*/
private class MySelectionListener implements SelectionListener {
/**
* @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetDefaultSelected(SelectionEvent e) {
isDirty = true;
fireEditorChanged();
commit();
}
/**
* @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetSelected(SelectionEvent e) {
isDirty = true;
fireEditorChanged();
commit();
}
}
/**
* @see eclox.ui.editor.editors.IEditor#commit()
*/
public void commit() {
if( hasInput() ) {
getInput().setValue(getSelection());
isDirty = false;
fireEditorChanged();
}
}
/**
* @see eclox.ui.editor.editors.IEditor#createContent(org.eclipse.swt.widgets.Composite, org.eclipse.ui.forms.widgets.FormToolkit)
*/
public void createContent(Composite parent, FormToolkit formToolkit) {
// Initialize the parent control.
RowLayout layout = new RowLayout(SWT.VERTICAL);
layout.marginWidth = 0;
parent.setLayout( layout );
// Creates the buttons.
yesButton = formToolkit.createButton( parent, "Yes", SWT.RADIO );
noButton = formToolkit.createButton( parent, "No", SWT.RADIO );
defaultButton = formToolkit.createButton( parent, "Default", SWT.RADIO );
// Attaches a selection listener instance to each button.
yesButton.addSelectionListener( new MySelectionListener() );
noButton.addSelectionListener( new MySelectionListener() );
defaultButton.addSelectionListener( new MySelectionListener() );
}
/**
* @see eclox.ui.editor.editors.IEditor#grabVerticalSpace()
*/
public boolean grabVerticalSpace() {
return false;
}
/**
* @see eclox.ui.editor.editors.IEditor#dispose()
*/
public void dispose() {
// Pre-condition
assert yesButton != null;
assert noButton != null;
assert defaultButton != null;
// Release all resources.
yesButton.dispose();
noButton.dispose();
defaultButton.dispose();
yesButton = null;
noButton = null;
defaultButton = null;
super.dispose();
}
/**
* @see eclox.ui.editor.editors.IEditor#isDirty()
*/
public boolean isDirty() {
return isDirty;
}
/**
* @see eclox.ui.editor.editors.IEditor#isStale()
*/
public boolean isStale() {
boolean result = false;
if( hasInput() ) {
result = getSelection().equalsIgnoreCase(getInput().getValue()) == false;
}
return result;
}
/**
* @see eclox.ui.editor.editors.IEditor#refresh()
*/
public void refresh() {
// Pre-condition
assert yesButton != null;
assert noButton != null;
assert defaultButton != null;
if( hasInput() ) {
this.isDirty = false;
String value = getInput().getValue();
yesButton.setSelection ( value.compareToIgnoreCase(YES) == 0 );
noButton.setSelection ( value.compareToIgnoreCase(NO) == 0 );
defaultButton.setSelection ( value.length() == 0 );
fireEditorChanged();
}
}
/**
* @see eclox.ui.editor.editors.IEditor#setEnabled(boolean)
*/
public void setEnabled(boolean enabled) {
// Pre-condition
assert yesButton != null;
assert noButton != null;
assert defaultButton != null;
yesButton.setEnabled(enabled);
noButton.setEnabled(enabled);
defaultButton.setEnabled(enabled);
}
/**
* @see eclox.ui.editor.editors.IEditor#setFocus()
*/
public void setFocus() {
// Pre-condition
assert yesButton != null;
assert noButton != null;
assert defaultButton != null;
Button selectedButton = null;
if( yesButton.getSelection() == true ) {
selectedButton = yesButton;
}
else if( noButton.getSelection() == true ) {
selectedButton = noButton;
}
else if( defaultButton.getSelection() == true ) {
selectedButton = defaultButton;
}
else {
assert false; // What's wrong?
}
selectedButton.setFocus();
}
/**
* Retrieves the selected value from the ui controls
*
* @return a string containing the selected value
*/
private String getSelection() {
// Pre-condition
assert yesButton != null;
assert noButton != null;
assert defaultButton != null;
if( yesButton.getSelection() == true ) {
return new String(YES);
}
else if( noButton.getSelection() == true ) {
return new String(NO);
}
else if( defaultButton.getSelection() == true ) {
return new String();
}
else {
assert false; // What's going on ?
return new String();
}
}
}